######################
#                    #
#     sens8tion      #
# gun kata simulator #
#                    #
######################


# Colours:
#bad9b6
#1a3279
#fff6d6
#000000

# When the player pushes a key, in a circle:
# 1 2 3
# 4 5 6
# 7 8 9

# We compliment the previous input number with the next number, provided it is not the same value
# Additionally, 1 8 is the same as 8 1


# OK so here's what the game is:
# Introduce Gunkata
# Use Buzzer to emulate the flashes of light from the start of the movie
# need to kill guys

# Your friend has betrayed you. He is reading POETRY

# Then we want to kill Sean Bean to unlock the emotion bar.
# Feelings UNLOCKED

# You got: A DOG.
# Feelings + 7

# Then some cops want to hurt your dog

# You found: SOME GUYS. They seem like they might LIKE YOU.
# Feelings + 3
# OH NO The cops again! Close quarters battle!

# You trade GUYS for MEETING FATHER
# This makes you feel a SAD.
# Feelings + 13

# OH NO: A CORRIDOR
# BEGIN PENULTIMATE BATTLE

# OH SHIT KATANA MEN. Can I add a katana to my guy? That is gonna be so hard to do.

# Final battle? I want this so bad


:alias StepTimer vd
:alias playerX va
:alias playerY vb

:alias TextDancerX va
:alias TextDancerY vb

:alias killbox v9
:alias killbox_X va
:alias killbox_Y vb
:alias killbox_character vc


:alias TextKing_X v1
:alias TextKing_Y v2

:alias TextKing_X_Override va
:alias TextKing_Y_Override vb

:alias fightLoopValue v8
:alias cleanupcalculator v7
:alias suckvalue v6
:alias kills v5

:alias corridorAlternate v4

:const intro_text_x 0x1
:const intro_upper_text_y 0x11
:const intro_lower_text_y 0x2a


:const buzzer_gun_flash 5

:const BarBottomFill 0x40
:const intro_timer 14
:const step_bar_capacity 14

:const boxX_long_minus_2 0x20
:const boxX_long_middle 0x38
:const boxX_long_plus_2 0x50

:const boxY_long_minus_2 0x0
:const boxY_long_middle 0x18
:const boxY_long_plus_2 0x30

:const some18s 0x05d

:const enemyDataArea 0x1b0

:const trooper_value 0x01
:const katanaman_value 0x21
:const body_value 0x41
:const character_to_hit_displacement 0x81
:const handgun_man_hit 0x61

#:org 0x1b0
#: enemyDataArea
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0

#:org 0x1F0
#: textStartParagraphPositions
#	0 0 0
#: textNewParagraphPositions
#	0 0 0

#:org 0x200
: main
	# We know for sure that registers are allocated as 0, but, we do not know that our memory is allocated as 0 unless
	# it is allocated in the rom.
	# As a result, we 0 out data we may read from in advance:

	fightLoopValue := 0xfe
	#:breakpoint testrewrite
	writeGameValues

	set_normal_loops

: restartGame
	lores

	fightLoopValue := 0xff
	turn_off_dance

	:unpack 0xA title_text
	i := textReadAddress
	save v1

	v1 := 0x05
	v2 := 0x18

	textKing

	v0 := key

	hires
	clear

	# Initialise new paragraph location for introduction:
	v0 := 0
	v1 := intro_text_x
	v2 := intro_lower_text_y

	i := 0x1F3 # textNewParagraphPositions
	save v2

	v2 := intro_upper_text_y
	i := 0x1F0 # textStartParagraphPositions
	save v2

	# Set up the introduction sequence in the main loop:
	:unpack 0x1 introductionSequence
	i := stepEndInsert
	save v1

	# Restore text introduction start point:
	:unpack 0xA intro_text
	#:unpack 0xA intro_text_skip
	i := textReadAddress
	save v1

	game_loop
	#jump gameTestJump

	# At this point, we wil have preston on the screen in a pose, we want to move him to be idle:

	# Remove the existing hit bodies:
	#i := inputzones
	#load v1
	#draw_antagonist_tutorial
	#i := lastinput_less_2
	#load v1
	#draw_antagonist_tutorial

	# Set perston idle:
	go_idle

	# Draw corpses everywhere:

	fightLoopValue := 0
	killbox := 0
	killbox_character := body_value # Address corpse
	loop
		draw_antagonist
		killbox += 4
		if killbox != 0x20 then
	again

	# Address lightly and make the text dance:

	TextDancerX := 43
	:unpack 0xA end_intro_lightly
	danceTextLoop

	:unpack 0xA	text_future
	cutsceneWait5

	:unpack 0xA	text_peace
	cutsceneWait5

	:unpack 0xA	text_yourfriend
	cutsceneWait5

	:unpack 0xA	text_poetry
	textKing_fullPackage
	:unpack 0xA text_poetry_justpoetry
	TextDancerX := 1
	danceTextLoop

	:unpack 0xA text_mistake
	cutsceneWait5

	:unpack 0xA text_lookatbody
	cutsceneWait5

	:unpack 0xA text_takeaction
	textKing_fullPackage
	:unpack 0xA text_saveadog_easy
	textKing_fullPackage
	:unpack 0xA text_saveadog
	TextDancerX := 1
	danceTextLoop

	#: intro_end

	#:breakpoint A
	:unpack 0xA text_copswant
	textKing_fullPackage

	# Because we just finished a string, at this point, v0 will be 0xFF
	# restore the 'kill all' text to kill all
	i := text_killthemall_mod
	save v0

	vf := 0xf1
	TextKing_X_Override := 0x55
	TextKing_Y_Override := intro_upper_text_y
	:unpack 0xA text_yourdog
	textKing_fullPackage

	drawkillthem

	clear

	set_normal_loops
	

	# We need to like make a game lol
	# Set progress values:
	writeGameValues

	# Draw cops:
	kills := 32
	killbox := 0
	killbox_character := trooper_value # Address trooper
	loop
		fightLoopValue := 0
		fightLoop
		killbox += 4
		if killbox != 0x20 then
	again

	fightLoopValue := 1
	killbox := 0
	game_loop

	clear

	:unpack 0xA text_takeaction
	textKing_fullPackage
	:unpack 0xA text_savemen
	cutsceneWait5
	clear

	:unpack 0xA text_seemsmaybethey
	cutsceneWait5

	:unpack 0xA text_copswant
	textKing_fullPackage

	vf := 0xf1
	TextKing_X_Override := 0x55
	TextKing_Y_Override := intro_upper_text_y
	:unpack 0xA text_yourmen
	textKing_fullPackage

	drawkillthem

	kills := 48
	killbox := 0
	killbox_character := trooper_value # Address trooper
	loop
		# This will bring the cops in close like in the movie:
		fightLoopValue := 20
		fightLoop
		fightLoopValue := 0
		fightLoop
		killbox += 4
		if killbox != 0x20 then
	again

	game_loop

	clear

	v0 := 0x6A
	i := text_killthemall_mod
	save v0

	:unpack 0xA text_trademen
	cutsceneWait5

	:unpack 0xA text_theyknow
	textKing_fullPackage
	drawkillthem

	i := stepEndInsert
	:unpack 0x1 corridorEndLoop
	save v1
	
	:unpack 0x2 corridor_fightLoop
	i := stepLoopInsert
	save v1

	# we need to restore the regular positions
	fightLoopValue := 0xfe
	writeGameValues

	corridorAlternate := 0

	kills := 48

	game_loop_skip_bars

	
	clear
	set_normal_loops

	:unpack 0xA text_katanamen
	cutsceneWait5

	kills := 8
	killbox := 0
	killbox_character := katanaman_value
	loop
		# This will bring the cops in close like in the movie:
		fightLoopValue := 20
		fightLoop
		fightLoopValue := 77
		fightLoop
		killbox += 4
		if killbox != 0x20 then
	again

	game_loop

	clear
	:unpack 0xA text_takeaction
	textKing_fullPackage
	:unpack 0xA text_killfather
	cutsceneWait5
	clear

	i := stepEndInsert
	:unpack 0x1 finalEndLoop
	save v1
	
	:unpack 0x2 finalFightLoop
	i := stepLoopInsert
	save v1

	killbox_character := random 0xE0
	drawboss

	StepTimer := 64
	game_loop_skip_StepReset

	: gameTestJump
	clear

	vf := buzzer_gun_flash
	buzzer := vf

	exit
	#jump restartGame
	#jump main

: drawboss
	i := preston
	i += killbox_character
	sprite killbox suckvalue 0
;

: finalFightLoop
	
	if vf == 0x55 begin
		#:breakpoint testboss
		drawboss
		killbox := random 0x0f
		suckvalue := random 0x0f
		killbox += 0x30
		suckvalue += 0x10
		killbox_character := random 0xE0
		drawboss
		end
;



: corridorEndLoop

	# Remove preston:
	address_preston	
	scroll-left
	scroll-left
	# redraw preston
	address_preston

	killbox_character := trooper_value
	v2 := 0x70

	v3 := corridorAlternate
	vf := 0x30
	corridorAlternate ^= vf
	draw_antagonist_data_prefilled

	if kills == 0 then return

	jump stepEndInsertReturn

: corridor_fightLoop
	if vf == 0x55 begin
		fightLoopValue := 40
		i := inputzones
		shootEnemy
		
		end

	# If the player pushed a button this turn:
	decrease_step_display
	decrease_step_display
	if StepTimer != 0 then decrease_step_display
	if StepTimer != 0 then decrease_step_display

: finalEndLoop
;

: realGameEndRoundLoop

	# We will iterate over all targets, count any we should have shot that we should have shot
	killbox := 0
	if kills == 0 then StepTimer := 0
	# 6 is: Score stuff
	loop
		fightLoopValue := 6
		fightLoop

		killbox_character := trooper_value
		fightLoopValue := 0
		if kills != 0 then fightLoop

		killbox += 0x4
		if killbox != 0x20 then
	again

	# if our kills has wrapped around then we're done
	if StepTimer == 0 then return

	jump stepEndInsertReturn

: allboxes_fightloop

	# If the player pushed a button this turn:
	if vf == 0x55 begin
		fightLoopValue := 2
		i := inputzones
		shootEnemy
		
		fightLoopValue := 1
		end
;

	# we no longer run any service on enemies
	#if fightLoopValue == 0xff then return

	# Cycle over one enemy at a time to process them:
	#killbox += 4
	#if killbox == 0x20 then killbox := 0
	#fightLoop
#;

: shootEnemy
	load v1
	v0 <<= v0
	v0 <<= v0

	i := enemyDataArea
	i += v0
	jump fightLoop_PreAddressed

: fightLoop
	if fightLoopValue == 0xff then return

	# Let's get their progress and health:
	i := enemyDataArea
	i += killbox
: fightLoop_PreAddressed
	load v3

	if fightLoopValue == 6 begin
		if v1 == 0 then return
		StepTimer += 1
		cleanupcalculator := v1
		v1 := 0
		save v1
		# Remove the character
		killbox_character := cleanupcalculator
		draw_antagonist_data_prefilled

		# If it was a hit enemiy, draw a corpse somewhere
		if cleanupcalculator > body_value begin
			if kills != 0 then kills += -1
			killbox_character := body_value
			v2 := random 0x3F
			v2 += -39
			v3 := random 0x1F
			draw_antagonist_data_prefilled
			end
		
		if cleanupcalculator < body_value then add_suck

		end


	if fightLoopValue == 77 then jump force_spawn
	# This is creating an enemy:
	if fightLoopValue == 0 begin
		if v1 != 0 then return
		vf := random 0x01
		if vf == 0 then 
			: force_spawn v1 := killbox_character
		if v1 == 0 then return
		save v1
 		draw_antagonist_data_prefilled
		end

	# This is shooting an enemy
	if fightLoopValue == 2 begin
		# If is not shootable character:
		if v1 == 0 then return
		if v1 > 0x40 then return
		killbox_character := v1
		v1 := character_to_hit_displacement
		save v1
		draw_antagonist_data_prefilled
		killbox_character := v1
		draw_antagonist_data_prefilled

		end

	if fightLoopValue == 20 begin
		v2 >>= v2
		v2 += 0x1c
		v3 >>= v3
		v3 += 0xc
		save v3
		end

	if fightLoopValue == 40 begin
		v2 += 4
		v3 += 4
		i := anFF
		sprite v2 v3 1

		if vf != 0 begin
			sprite v2 v3 1
			v2 += -4
			v3 += -4
			killbox_character := trooper_value
			draw_antagonist_data_prefilled
			killbox_character := body_value
			draw_antagonist_data_prefilled
			if kills != 0 then kills += -1
			else
			sprite v2 v3 1
			end

		end
	: skipProgressDraw
;

: add_suck
	if suckvalue == step_bar_capacity then return
	suckvalue += 1
	v1 := -8
	v2 := suckvalue
	vf := BarBottomFill
	v2 =- vf
	i := barfill
	sprite v1 v2 1
;

: writeGameValues
	v4 := 4
	i := enemyDataArea
	vf := 0
	loop
		# v1 is operation select:
		if fightLoopValue == 0xfe begin
			i := get_killbox
			i += vf
			load v1
			v2 := v0
			v3 := v1
			i := enemyDataArea
			i += vf
			i += vf
			else
			load v3
			end

		v0 := 0
		v1 := 0
		save v3
		i += v4
		vf += 2
		if vf != 16 then
	again
;

: set_normal_loops
	i := stepEndInsert
	:unpack 0x1 realGameEndRoundLoop
	save v1

	:unpack 0x2 allboxes_fightloop
	i := stepLoopInsert
	save v1
;

: cutsceneWait5
	# Write text based on v0 / v1 values being the address
	textKing_fullPackage
	loop
	test_input
	if v1 != 0x5 then again
	# Remove text
	textKing_useSavedParagraph
;

: game_loop
	suckvalue := 0
	draw_bars
: game_loop_skip_bars
	StepTimer := 0
: game_loop_skip_StepReset
	# Set initial player position:
	playerX := 0x38
	playerY := 0x18

	# Create a preston:
	address_preston
: game_loop_skip_preston
	# Draw the display bars:
	StepTimer += intro_timer
	fill_step_display
	loop
		vf := 8
		delay := vf

		decrease_step_display

		input_loop

		: stepLoopInsert
		allboxes_fightloop

		if StepTimer == 0 begin
			StepTimer := buzzer_gun_flash
			buzzer := StepTimer

			: stepEndInsert
			0 0

			: stepEndInsertReturn

			StepTimer := intro_timer
			fill_step_display
			end
		
		loop
			vf := delay
			if vf != 0 then
		again

	again


: danceTextLoop
	TextDancerY := 42
: danceTextLoop_NoAutoY
	i := textReadAddress
	save v1
	turn_on_dance
	v3 := TextDancerX
	v4 := 0
	loop

		TextDancerX := v3

		# manually get the correct positions:
		v1 := TextDancerX
		v2 := TextDancerY

		# Doing both directions is quite expensive but a nicer effect:
		if v4 == 0 then TextDancerX += 1
		if v4 == 1 then TextDancerY += 1
		if v4 == 2 then TextDancerX += -1
		if v4 == 3 then TextDancerY += -1
		if v4 == 4 then TextDancerX += -1
		if v4 == 5 then TextDancerY += 1
		if v4 == 6 then TextDancerX += 1
		if v4 == 7 then TextDancerY += -1

		v3 := TextDancerX

		textKing

		v4 += 1
		if v4 == 8 then v4 := 0

		test_input
		if v1 != 0x5 then
	again
: turn_off_dance
	clear
	v0 := 0x8F 
	v1 := 0xF0
	i := custom_text_behavior
	save v1
;

: introductionSequence

	kills := 0 # Pass number
	
	# we need to remove any old text first
	: introTextRedrawLoop
	# In the tutorial, we want to draw a hit guy wherever the player is aiming
	i := inputzones
	load v1
	draw_antagonist_tutorial
	i := lastinput_less_2
	load v1
	draw_antagonist_tutorial

	kills += 1

	textKing_useSavedParagraph
	if v0 == 0xfd then return
	
	if kills == 2 then jump introTextRedrawEnd

	# Increase text pointer to next section:
	i := textReadAddress
	load v1
	v1 += vf
	v0 += vf
	# We don't need this if using the Superchip save/load I quirk
	# but we do use jump tables. Shit.
	#i := textReadAddress
	save v1

	if kills == 1 then jump introTextRedrawLoop

	: introTextRedrawEnd

	jump stepEndInsertReturn





########################
##
## Worker stuff:

: input_loop

	i := lastinput_less_2
	load v3
	# v2 will contain the modified value
	# v3 will contain the original keystroke

	test_input

	# If this matchse the last input key, ignore it
	if v1 == v3 then return
	if v1 == 0 then return
	if v1 >= 10 then return

	# Copy this to v0
	v0 := v1

	# decrease by 1 by default:
	v0 += -1
	# Decrease v0 value by 1 if now over 4
	if v0 >= 4 then v0 += -1

	# Store these values for next pass:
	i := lastinput
	save v1

	# save the inputs the player has given:
	i := inputzones
	save v3

	if v1 == 5 then jump go_idle

	# work out which is the lesser of v0 and v2
	# and swap them around if needed
	if v2 < v0 begin
		vf := v0
		v0 := v2
		v2 := vf
		end



: input_bypass
	# Whatever the lowest value is is, we know that the set will be 8 - v0 values long
	# So whatever our value in v0 is, we'll need to increase i by a fairly large amount depending on the value.
	# Maybe we should just use a jump table for this, as it's already in v0, already has no gap, and is going to make things a bit easier
	# At the very least we can store how much we need to move on divided by 4 in there:

	# Our higher value, v2, tells us how many more frames we need to advance
	# However this number is relative to what v0 was, so, we need to step on (v2 - v0  - 1 frames)

	# Example, if inputs were 2 6, these would read now as 1 4
	# We would need to increase by 7 frames, to start at 1 2, then go forward 2 more frames to get to
	# 1 4
	# 4 - 1 = 3, so we reduce that by an additional 1
	v2 -= v0
	v2 += -1

	# Now that we have that smaller value calulated, let's calculate the larger value:
	i := group_select_a
	i += v0
	load v0

	v3 := v0
	
	: group_select_a_end

	playerX := 0x38
	playerY := 0x18

	# remove existing:
	address_preston

	# caluclate new value:
	calc_preston

	vf := 0x55
;

: test_input
	v1 := 0xff
	v0 := 1   if v0 key then v1 := v0
	v0 := 2   if v0 key then v1 := v0
	v0 := 3   if v0 key then v1 := v0
	v0 := 4   if v0 key then v1 := v0
	v0 := 6   if v0 key then v1 := v0
	v0 := 7   if v0 key then v1 := v0
	v0 := 8   if v0 key then v1 := v0
	v0 := 9   if v0 key then v1 := v0
	v0 := 5   if v0 key then v1 := v0
;

# Draw the idle figure:
: go_idle
	playerX := 0x38
	playerY := 0x18

	address_preston

	:unpack 0xA preston_idle
	i := address_preston
	save v1

	address_preston

	i := lastinput_less_2
	v1 := 5
	save v1
;



: calc_preston
	# uses: v0, v1, v2, v3, vf
	# Uses v3 and v2 values to step forward from the i start point and select the correct sprite
	# We save 2 cycles by using self modifying code here I guess, except we probably lose those in calling
	# draw preston as a subroutine.

	# By using self modifying code here, we only save about 2 instructions
	# versus just re incrimenting I to get back to the correct location

	:unpack 0xA preston 	# added by self mod
	v1 += v3
	v0 += vf	# added by self mod
	v1 += v3
	v0 += vf	# added by self mod
	v1 += v3
	v0 += vf	# added by self mod
	v1 += v3
	v0 += vf 	# added by self mod

	v2 <<= v2 	# multiply by 2
	v2 <<= v2 	# by 4
	v2 <<= v2 	# by 8
	v2 <<= v2   # by 16
	v2 <<= v2 	# by 32

	v1 += v2
	v0 += vf	# added by self mod

	i := address_preston 	# added by self mod
	save v1 			# added by self mod
: address_preston
	i := preston_idle
	sprite playerX playerY 0
;

## Draw Bars - draws the UI bars onto the screen
: draw_bars
	i := barbody
	v0 := 0
	v1 := 0x31
	sprite v0 v1 0xf
	v0 := 0x78
	sprite v0 v1 0xf
;

: fill_step_display
	v0 := step_bar_capacity

	v1 := 0
	v2 := BarBottomFill
	i := barfill
	loop
		v0 += -7
		v2 += -7
		sprite v1 v2 7
		if v0 != 0 then
	again
;

: decrease_step_display
	v1 := 0
	v2 := StepTimer
	vf := BarBottomFill
	v2 =- vf
	i := barfill

	sprite v1 v2 1

	StepTimer += -1
;

: draw_antagonist_tutorial
	# v0 - v1 contain as follows:
	# inputzone (0 1 2  3 _ 4  5 6 7 )
	# input region (1 2 3  4 5 6  7 8 9)
	# We want to position the target wherever they were aiming for this, so we must have preloaded v0 and in this case, v1 with valid data
	if v1 == 5 then return
	killbox_character := handgun_man_hit # hit handgun man
	killbox := v0
	killbox <<= killbox
	killbox <<= killbox
: draw_antagonist
	# normal antagonist draw routine, v0 selects which zone they are located in

	i := enemyDataArea
	i += killbox
	load v3

: draw_antagonist_data_prefilled
	i := antagonist_sprite_data
	i += killbox_character
	
	sprite v2 v3 0
;

: inputzones
	0x00 0x05
: lastinput_less_2
	0x00 0x05
: lastinput
	0x05 0x07

: barbody
	0x7E 0x42 0x42 0x5A 0x42 0x5A 0x42 0x5A 
	0x42 0x5A 0x42 0x5A 0x42 0x5A 0x42 
: barfill
	0x3C 0x3C 0x3C 0x3C 0x3C 0x3C 
: antagonist_sprite_data
						0x3C


#: handgun_person
#0x00 0x00 0x00 0x00 0x00 0x00 0x03 0xC0 
#0x03 0xC0 0x03 0xC0 0x01 0x80 0x03 0xC0 
#0x03 0xFC 0x03 0xF0 0x01 0xE0 0x01 0x80 
#0x03 0xC0 0x06 0x60 0x06 0x60 0x0E 0x70 

: trooper
0x00 0x00 0x00 0x00 0x03 0xC0 0x03 0xC0 
0x03 0xC0 0x01 0x80 0x03 0xCC 0x07 0xF8 
0x07 0xF0 0x0F 0xE0 0x07 0x80 0x03 0xC0 
0x07 0xE0 0x06 0xE0 0x06 0x60 0x0E 0x70 

: katanaman
0x00 0x00 0x00 0x00 0x23 0xC0 0x23 0xC0 
0x23 0xC0 0x21 0x80 0x33 0xC0 0x17 0xC0 
0x1F 0xC0 0x0D 0x80 0x01 0x80 0x03 0xC0 
0x07 0xE0 0x06 0x60 0x06 0x60 0x0E 0x70 

: body
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x07 0x80 0x1F 0xCC 0x1F 0xFE 0x3F 0xFE 

: dying_handgun
0x00 0x00 0x00 0x00 0x00 0x00 0x08 0x00 
0x1C 0x00 0x3E 0x00 0x3C 0xE0 0x1F 0xF0 
0x07 0x80 0x1F 0xC0 0x3B 0xE0 0x21 0xF0 
0x23 0x38 0x03 0x18 0x03 0x00 0x03 0x00 

: dying_trooper
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 
0x00 0xE0 0x01 0xF0 0x01 0xF0 0x03 0xE0 
0x03 0xC0 0x07 0xE0 0x0F 0x70 0x0F 0xB0 
0x1F 0x98 0x1C 0xD8 0x0C 0xC8 0x18 0xC4 

: dying_katana
#0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
#0x00 0x00 0x1E 0x00 0x1E 0x00 0x1F 0x00 
#0x0F 0x80 0x0F 0xC0 0x1F 0xC0 0x05 0xC0 
#0x01 0xE0 0x03 0x30 0x03 0x30 0x7F 0xB8 


: preston
	0x00 0x00 0x00 0x20 0x08 0x20 0x04 0x60
	0x0E 0xC0 0x07 0xDC 0x03 0xFC 0x01 0xFC
	0x00 0xF0 0x01 0xE0 0x07 0xC0 0x0F 0xC0
	0x3C 0xC0 0x18 0xC0 0x00 0xC0 0x01 0xC0

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x10 0x08 0x10 0x08 0x08 0x10 0x18 0x18
	0x0C 0x30 0x0D 0xB0 0x07 0xE0 0x03 0xC0
	0x03 0xC0 0x03 0xC0 0x07 0xE0 0x0F 0xF0

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x10 0x00 0x0C 0x00 0x06 0x00
	0xE7 0x00 0x33 0x80 0x1D 0xC0 0x0F 0xC0
	0x0F 0xF0 0x0F 0xFC 0x0E 0xFE 0x03 0xFE

	0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x00
	0x08 0x00 0x0C 0x00 0x07 0x80 0x07 0x8E
	0x07 0x98 0x07 0xF8 0x03 0xE0 0x03 0x80
	0x01 0x80 0x47 0xDE 0x7F 0xFF 0x7E 0x79

	0x00 0x00 0x00 0x00 0x00 0x00 0x20 0x00
	0x18 0x00 0x1C 0x03 0x06 0x0F 0x77 0x1D
	0x7F 0xFC 0x7F 0xF8 0x07 0x9C 0x0E 0x3C
	0x1C 0x30 0x38 0x10 0x20 0x00 0x40 0x00

	0x00 0x00 0x00 0x00 0x20 0x00 0x10 0x00
	0x18 0x00 0x1C 0x00 0x0E 0x00 0x07 0xC0
	0x1F 0xC0 0x3F 0xC0 0x3F 0x00 0x3B 0x00
	0x7D 0x00 0x7D 0x80 0x6C 0x80 0x66 0x80

	0x00 0x00 0x08 0x00 0x04 0x00 0x0E 0x00
	0x06 0x00 0x07 0x00 0x0F 0x80 0x0F 0x80
	0x0F 0xC0 0x01 0xF0 0x03 0xF8 0x03 0xF8
	0x06 0xCC 0x0E 0xE2 0x0C 0x70 0x1C 0x20

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x01 0x18 0x03 0x30 0x3B 0xF0 0x3F 0xC0
	0x3F 0x80 0x03 0x80 0x01 0x80 0x01 0x80
	0x03 0x80 0x02 0x80 0x06 0xC0 0x07 0xE0

	0x00 0x10 0x00 0x10 0x03 0xB0 0x03 0xE0
	0x03 0xE0 0x01 0xE0 0x7F 0xE0 0x1F 0xE0
	0x01 0xC0 0x01 0x80 0x01 0x80 0x01 0x80
	0x01 0x80 0x01 0x80 0x01 0x80 0x03 0xC0

	0x00 0x10 0x00 0x10 0x03 0xB0 0x03 0xB0
	0x03 0xE0 0x01 0xE0 0x03 0xE0 0x07 0xC0
	0x07 0xE0 0x03 0xE0 0x01 0xB8 0x01 0x80
	0x01 0x80 0x01 0x80 0x01 0x80 0x03 0xC0

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x80 0x00 0x80 0x03 0x98 0x01 0xBC
	0x01 0xFC 0x03 0xF8 0x0F 0xE0 0x1F 0xE0
	0x33 0xC0 0x03 0x80 0x07 0xF0 0x0F 0xF8

	0x00 0x00 0x01 0x00 0x01 0x00 0x01 0xC8
	0x00 0x8C 0x01 0x84 0x07 0x3C 0x0F 0xF8
	0x7F 0xE0 0x7E 0x70 0x76 0x38 0x04 0x0C
	0x06 0x02 0x04 0x00 0x04 0x00 0x00 0x00

	0x00 0x00 0x02 0x00 0x02 0x00 0x06 0x00
	0x02 0x00 0x07 0x00 0x07 0x00 0x07 0x80
	0x03 0xC0 0x07 0xE8 0x07 0xBC 0x03 0x9A
	0x03 0xC0 0x06 0x60 0x0C 0x30 0x18 0x18

	0x00 0x00 0x00 0x00 0x00 0x00 0x03 0x80
	0x03 0x80 0x0F 0x84 0x3F 0xC8 0x07 0xD0
	0x07 0xF8 0x03 0xF0 0x03 0x80 0x07 0x80
	0x07 0x80 0x06 0xC0 0x06 0xC0 0x0E 0xE0

	0x00 0x00 0x00 0x04 0x00 0x08 0x00 0x10
	0x00 0x30 0x00 0x70 0x00 0x67 0x01 0xFC
	0x07 0xF8 0xEF 0xFC 0x7F 0x9C 0x3D 0x9C
	0x31 0x80 0x03 0x00 0x03 0x00 0x03 0x80

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02
	0x00 0x14 0x00 0x78 0x80 0xE0 0xE1 0xE0
	0xFF 0xFC 0x3F 0xFC 0x0F 0x9C 0x1E 0x00
	0x2E 0x00 0x0C 0x00 0x06 0x00 0x0E 0x00

	0x00 0x00 0x00 0x08 0x00 0x10 0x00 0x30
	0x00 0x30 0x00 0xE0 0x07 0xE0 0x07 0xF0
	0x0F 0xB8 0x0D 0xB8 0x19 0xB8 0x19 0x80
	0x18 0x80 0x08 0x80 0x00 0x00 0x00 0x00

	0x00 0x00 0x00 0x04 0x01 0xC8 0x01 0xD8
	0x01 0xF8 0x01 0xF0 0x03 0xE0 0x07 0xE0
	0x07 0xC0 0x03 0xC0 0x01 0xE0 0x01 0xF0
	0x01 0xC8 0x01 0x80 0x01 0x80 0x03 0xC0

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x07 0xE0 0x1F 0xF8
	0x3F 0xFC 0xE7 0xE7 0x03 0xC0 0x01 0x80
	0x01 0x80 0x01 0x80 0x03 0xC0 0x07 0xE0

	0x00 0x00 0x00 0x00 0x03 0x80 0x03 0x80
	0x03 0x80 0x01 0x80 0xE3 0xC0 0x3F 0xE0
	0x1F 0xE0 0x03 0xC0 0x07 0x80 0x0F 0x80
	0x13 0x80 0x01 0x80 0x01 0x80 0x03 0xC0

	0x00 0x00 0x00 0x00 0x00 0x08 0x00 0x0C
	0x0E 0x1C 0x03 0xF8 0x01 0xFE 0x01 0xFE
	0x03 0xEE 0x07 0xC0 0x0E 0xC0 0x3C 0xE0
	0x70 0x60 0x40 0x20 0x00 0x00 0x00 0x00

	0x00 0x00 0x0E 0x00 0x0C 0x00 0x0C 0x00
	0x06 0x00 0x06 0x00 0x07 0xBC 0x3B 0xFC
	0x0F 0xFC 0x07 0xF0 0x03 0xF8 0x03 0x1C
	0x03 0x04 0x03 0x02 0x03 0x80 0x03 0x80

	0x00 0x00 0x00 0x00 0x01 0xC0 0x01 0xC0
	0x01 0xC0 0x01 0x80 0x03 0xC7 0x07 0xFC
	0x07 0xB8 0x07 0x80 0x0F 0x80 0x0D 0x80
	0x19 0x80 0x11 0x80 0x01 0x80 0x03 0xC0

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x03 0x80 0x03 0x80 0x03 0x8E
	0x01 0xF8 0x03 0xF0 0x03 0xC0 0x03 0x80
	0x03 0xC0 0x07 0x60 0x0D 0x30 0x19 0x18

	0x01 0x80 0xE3 0xC0 0x67 0x00 0x36 0x00
	0x3F 0x00 0x3F 0x8E 0x17 0xF8 0x03 0xC0
	0x00 0xE0 0x01 0xF0 0x01 0xE0 0x00 0xD0
	0x00 0x08 0x00 0x00 0x00 0x00 0x00 0x00

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x1C 0x00 0x3C 0x00 0x7C 0x01 0xF8
	0x03 0xB8 0x04 0x7C 0x00 0x7C 0x00 0xF6
	0x01 0xB6 0x01 0x23 0x01 0x63 0x00 0x61

	0x00 0x00 0x0E 0x10 0x1C 0x78 0x18 0x6C
	0x0D 0xC4 0x0F 0x80 0x07 0x80 0x03 0x80
	0x01 0x80 0x03 0xC0 0x07 0xE0 0x0F 0xB0
	0x3B 0x98 0x63 0x8C 0x00 0x02 0x00 0x00

	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x3C 0x00 0x7C
	0x03 0xFC 0x0F 0xFC 0x1F 0xCC 0x3C 0xC6
	0x38 0xC6 0x2C 0x61 0x66 0x20 0xEE 0x20

: preston_idle
	0x00 0x00 0x00 0x00 0x03 0x80 0x03 0x80
	0x03 0x80 0x01 0x80 0x03 0xC0 0x07 0xE0
	0x07 0xE0 0x07 0xE0 0x07 0xE0 0x01 0x80
	0x01 0x80 0x01 0x80 
	: avalue01
	0x01 0x80 0x03 0xC0

############################################
#
# Text stuff

#############################
# Text stuff
#############################

: textKing_fullPackage
	i := textReadAddress
	save v1
: textKing_useSavedParagraph
	i := 0x1F0 # textStartParagraphPositions
	load v2

	if vf == 0xF1 begin
		TextKing_X := TextKing_X_Override
		TextKing_Y := TextKing_Y_Override
		end
: textKing
	# v1 v2 will be start x/y
	# v0 is used in saving/looading characters
	# vf is used for the character offset
	# ve is used for many control characters
	vf := 0
: textKing_noResetVf
	# Loop
		: textReadAddress
		i := intro_text
		
		i += vf
		vf += 1 	# Increase vf as early as possible
		load v0

		# Detect control characters:
		ve := 0xE0
		ve &= v0
		
		# Detect and use control characters:
		if ve != 0xE0 then jump textHandlerNotControl
			# Control characters:
			# 0xE#: Horizontal stepping of # * 3 pixels
			# 0xFF: End of string
			# 0xFE: Load new positions
			# 0xF?: Return to be handled by caller
			if v0 == 0xff then return # End of string
			if v0 == 0xfd then return # Text Sequence End
			if v0 == 0xfc then jump textHandler0xFC # Line break
			if v0 == 0xfe then jump textHandler0xFE # Paragraph Break
			# Otherwise it's number of half widths to move the cursor:
			v0 += 0x20
			loop
				TextKing_X += 3
				v0 += -1
				if v0 != 0 then
			again
			jump textKing_noResetVf

		: textHandlerNotControl

		i := fivewide
		i += v0
		# Save our vf value:
		v0 := vf
		# draw the character
		sprite TextKing_X TextKing_Y 5

		# if we wanted to do something fancy, here is where we should do it
		# Put back 0x8F 0xF0
		: custom_text_behavior
		vf := vf

		# Continue with texting:
		vf := v0
		TextKing_X += 6

	# substitute for loop since we'll likely upset Octo
	# Again...
	jump textKing_noResetVf

: textHandler0xFC # Carriage return
	i := 0x1F0 # textStartParagraphPositions
	load v1
	# if textkingX is v1:
	# TextKing_X := v1
	TextKing_Y += 6
	jump textKing_noResetVf
: textHandler0xFE # Go to second paragraph position
	i := 0x1F3 # textNewParagraphPositions
	load v2
	jump textKing_noResetVf

: textDancer
	# This makes the text dance:
	sprite TextDancerX TextDancerY 5
	TextDancerX += 6
;

: turn_on_dance
	:unpack 0x2 textDancer
	i := custom_text_behavior
	save v1
;

: drawkillthem
	#:breakpoint C
	vf := 0xf1
	TextKing_X_Override := intro_text_x
	TextKing_Y_Override := intro_lower_text_y
	:unpack 0xA text_killthem
	textKing_fullPackage
	#:breakpoint D
	TextDancerX := 1
	:unpack 0xA text_killthem
	danceTextLoop
;

: title_text
	0x2C 0x31 0x0C 0x2C 0x46 0x39 0x35 0x6F
	0x0C 
	: anFF 
	0xFF

: intro_text # (419 bytes)
	0xff
	0xE2 0x39 0x10 0x04 0x6F 0x13 0x24 0x10 0x6A
	0x7D 0x0C 0x7D 0x93 0x65 0x2C 0x35 0x2C
	0x6A 0x6F 0x90 0xFE 0xE2 0x6F 0x1B 0x31 0x04
	0x6A 0x3D 0x6F 0x6F 0x6F 0x6A 0x24 0x13
	0x0C 0x90 0x35 0x24 0x10 0x39 0x2C 0xFF

	0xE7 0x39 0x10 0x31 0x6A 0x20 0x93 0x31 0x04
	0x35 0x20 0x6A 0x10 0x7D 0x2C 0xFE 0xE6 0x00
	0x31 0x39 0x31 0x04 0x18 0x35 0x0C 0x31
	0x00 0x6A 0x39 0x10 0x7D 0x39 0xFF 

	0xE4 0x7D 
	0x0C 0x65 0x6A 0x24 0x31 0x6F 0x18 0x31
	0x39 0x04 0x35 0x20 0x6A 0x93 0x7D 0x65
	0xFE 0xE3 0x6F 0x13 0x39 0x6A 0x6F 0x90 0x6A
	0x7D 0x0C 0x39 0x7D 0x24 0x6F 0x0C 0x35
	0x2C 0x39 0x2C 0xFF 

	0xE3 0x35 0x2C 0x6A 0x7D
	0x6A 0x2C 0x39 0x7D 0x39 0x35 0x2C 0x39
	0x35 0x20 0x7D 0x93 0x93 0x65 0xFE 0xE2 0x76
	0x04 0x31 0x00 0x35 0x20 0x39 0x7D 0x74
	0x93 0x31 0x6A 0x31 0x93 0x31 0x18 0x31
	0x0C 0x39 0xFF 

	0xFF 
	# total weapon
	0xE2 0x24 0x13 0x0C 0x6A 0x08
	0x7D 0x39 0x7D 0x6A 0x13 0x2C 0x31 0x2C
	0x6A 0x7D 0x6A 0x24 0x13 0x0C 0xFE 0xE4 0x7D
	0x2C 0x6A 0x7D 0x6A 0x39 0x6F 0x39 0x7D
	0x93 0x6A 0x53 0x31 0x7D 0x76 0x6F 0x0C
	0xFF 
	# Each position kill zone
	0xE2 
	0x31 0x7D 0x20 0x10 0x6A 0x90 0x93
	0x13 0x35 0x00 0x6A 0x76 0x6F 0x2C 0x35
	0x39 0x35 0x6F 0x0C 0xFE 0xE2 0x00 0x31 0x0C
	0x6F 0x39 0x31 0x2C 0x6A 0x7D 0x6A 0x08
	0x35 0x93 0x93 0x6A 0x8C 0x6F 0x0C 0x31
	0xFF 
	# Max damage upon
	0xE3
	0x35 0x0C 0x90 0x93 0x35 0x20 0x39
	0x35 0x0C 0x24 0x6A 0x18 0x7D 0x7B 0x35
	0x18 0x13 0x18 0xFE 0xE9 
	0x00 0x7D 0x18 0x7D
	0x24 0x31 0x6A 0x13 0x76 0x6F 0x0C 0xFF
	# mximum opponents
	0xE3
	0x39 0x10 0x31 0x6A 0x18 0x7D 0x7B 0x35
	0x18 0x13 0x18 0x6A 0x0C 0x13 0x18 0x74
	0x31 0x04 0xFE 0xE9 0x6F 0x90 0x6A 0x6F 0x76
	0x76 0x6F 0x0C 0x31 0x0C 0x39 0x2C 0xFF

	# All while keeping clear
	0xE4 0x7D 0x93 0x93 0x6A 0x53 0x10 0x35 0x93
	0x31 0x6A 0x08 0x31 0x31 0x76 0x35 0x0C
	0x24 0xFE 0xE3 0x39 0x10 0x31 0x6A 0x00 0x31
	0x90 0x31 0x0C 0x00 0x31 0x04 0x6A 0x20
	0x93 0x31 0x7D 0x04 0xFF 

	# Stat return fire
	0xE3 0x6F 0x90 0x6A
	0x39 0x10 0x31 0x6A 0x2C 0x39 0x7D 0x39
	0x35 0x2C 0x39 0x35 0x20 0x7D 0x93 0xFE 0xE2 
	0x76 0x7D 0x39 0x10 0x6A 0x6F 0x90 0x6A
	0x04 0x31 0x39 0x13 0x04 0x0C 0x6A 0x90
	0x35 0x04 0x31 0xFF 
	0xFF
	# Master of gun kata
	0xE4 0x39 0x10 0x31 0x6A
	0x18 0x7D 0x2C 0x39 0x31 0x04 0x6A 0x6F
	0x90 0x6A 0x39 0x10 0x31 0xFE 0xEc 0x24 0x13
	0x0C 0x6A 0x08 0x7D 0x39 0x7D 0x2C 0xFF

: intro_text_skip
	# Not to be taken lightly
	0xE3 0x35 0x2C 0x6A 0x0C 0x6F 0x39 0x6A 0x39
	0x6F 0x6A 0x74 0x31 0x6A 0x39 0x7D 0x08
	0x31 0x0C 0xFE 0xEe 
	: end_intro_lightly
	0x93 0x35 0x24 0x10 0x39
	0x93 0x65 0xFD
	# Replace the lihgtly here hopefully

: text_future
	0x35 0x39 0x6A 0x35 0x2C 0x6A 0x39 0x10
	0x31 0x6A 0x90 0x13 0x39 0x13 0x04 0x31
	0xFE
	0x90 0x31 0x31 0x93 0x35 0x0C 0x24 0x6A
	0x35 0x2C 0x6A 0x7D 0x6A 0x20 0x04 0x35
	0x18 0x31 0xFF
: text_peace
	0x31 0x18 0x6F 0x39 0x35 0x6F 0x0C 0x2C
	0x6A 0x20 0x7D 0x13 0x2C 0x31 0x00 0x6A
	0x53 0x7D 0x04 
	0xFE
	0x0C 0x6F 0x53 0x6A 0x53 0x31 0x6A 0x10
	0x7D 0x1B 0x31 0x6A 0x76 0x31 0x7D 0x20
	0x31  0xFF
: text_yourfriend
	0x65 0x6F 0x13 0x04 0x6A 0x90 0x04 0x35
	0x31 0x0C 0x00 0x6A 0x10 0x7D 0x2C 
	0xFE
	0x74 0x31 0x39 0x04 0x7D 0x65 0x31 0x00
	0x6A 0x65 0x6F 0x13 0xFF
: text_poetry
	0x10 0x31 0x6A 0x35 0x2C 0x6A 0x04 0x31
	0x7D 0x00 0x35 0x0C 0x24 0x6A 0xFE
: text_poetry_justpoetry
	0x76 0x6F
	0x31 0x39 0x04 0x65 0xFF

: text_mistake
	0x76 0x7D 0x04 0x39 0x04 0x35 0x00 0x24
	0x31 0x6A 0x35 0x2C 0x6A 0x00 0x31 0x7D
	0x00 
	0xFE
	0x39 0x10 0x35 0x2C 0x6A 0x53 0x7D 0x2C
	0x6A 0x7D 0x6A 0x18 0x35 0x2C 0x39 0x7D
	0x08 0x31 0xFF

: text_lookatbody
	0x65 0x6F 0x13 0x6A 0x93 0x6F 0x6F 0x08
	0x6A 0x7D 0x39 0x6A 0x39 0x10 0x31 0x6A
	0x74 0x6F 0x00 0x65
	0xFE
	0x65 0x6F 0x13 0x6A 0x90 0x31 0x31 0x93
	0x6A 0x90 0x31 0x31 0x93 0x35 0x0C 0x24
	0x2C 0x57 0xFF

: text_takeaction
	0x65 0x6F 0x13 0x6A 0x18 0x13 0x2C 0x39
	0x6A 0x39 0x7D 0x08 0x31 0x6A 0x7D 0x20
	0x39 0x35 0x6F 0x0C 0xFF
: text_saveadog_easy
	0xFE
: text_saveadog
	0x65 0x6F 0x13 0x6A 0x2C 0x7D 0x1B 0x31
	0x6A 0x7D 0x6A 0x00 0x6F 0x24 0xFF

: text_copswant
	0x39 0x10 0x31 0x6A 0x20 0x6F 0x76 0x2C
	0x6A 0x53 0x7D 0x0C 0x39 0x6A 0xFF
: text_yourdog
	0x39 0x10 0x31 0x6A 0x00 0x6F 0x24 0xFF
: text_yourmen
	0x39 0x10 0x31 0x6A
	#0x65 0x6F 0x13 0x04 0x6A # your is too long :(
	0x18 0x31 0x0C 0xFF

: text_killthem
	0x08 0x35 0x93 0x93 0x6A 0x39 0x10 0x31
	0x18 
: text_killthemall_mod # Turn this to 0x6A to have a space
	0xFF
	0x7D 0x93 0x93 0xFF

: text_savemen
	0xFE
	0x65 0x6F 0x13 0x6A 0x2C 0x7D 0x1B 0x31
	0x6A 0x2C 0x6F 0x18 0x31 0x6A 0x18 0x31
	0x0C 0xFF

: text_seemsmaybethey
	0x35 0x39 0x6A 0x2C 0x31 0x31 0x18 0x2C
	0x6A 0x18 0x7D 0x65 0x74 0x31 0x6A 0x39
	0x10 0x31 0x65 0xFE
: text_likeyou
	0x93 0x35 0x08 0x31
	0x6A 0x65 0x6F 0x13 0xFF

: text_trademen
	0x39 0x10 0x31 0x6A 0x18 0x31 0x0C 0x6A
	0x10 0x7D 0x1B 0x31 0x6A 0x7D 0x6A 0x76
	0x93 0x7D 0x0C 0xFE
	0x65 0x6F 0x13 0x6A 0x53 0x35 0x93 0x93
	0x6A 0x18 0x31 0x31 0x39 0x6A 0x90 0x7D
	0x39 0x10 0x31 0x04 0xFF

: text_theyknow
	0x39 0x10 0x31 0x65 0x6A 0x08 0x0C 0x6F
	0x53 0x6A 0x65 0x6F 0x13 0x6A 0x90 0x31
	0x31 0x93 0xFF

: text_katanamen
	0x6F 0x10 0x6A 0x2C 0x10 0x35 0x39 0x57
	0x6A 0x08 0x7D 0x39 0x7D 0x0C 0x7D 0x6A
	0x18 0x31 0x0C 0x57 0xFE
: text_toobad
	0x39 0x6F 0x6F 0x6A 0x74 0x7D 0x00 0x6A
	0x65 0x6F 0x13 0x6A 0x10 0x7D 0x1B 0x31
	0x6A 0x24 0x13 0x0C 0x2C 0xFF

: text_killfather
	0xFE 0x08 0x35 0x93 0x93 0x6A 0x90 0x7D 0x39
	0x10 0x31 0x04 0xFF


# Jump tables out in the butt of the program because of broken jump0, we stick them here so we can just use vf
# TURNS OUT: way more efficient to not use jump tables
#:org 0xF9F
	# The value in v1 will be how many frames we must advance, * 8, which if we apply 4 times
	# will correctly step us forward
	: group_select_a
	0
	56
	104

	144
	176
	200

	216

: get_killbox
	# I just remembered this doesn't work:
	#boxX_long_minus_2
	#boxY_long_minus_2
	#boxX_long_middle
	#boxY_long_minus_2
	#boxX_long_plus_2
	#boxY_long_minus_2
	#boxX_long_minus_2
	#boxY_long_middle
	#boxX_long_plus_2
	#boxY_long_middle
	#boxX_long_minus_2
	#boxY_long_plus_2
	#boxX_long_middle
	#boxY_long_plus_2
	#boxX_long_plus_2
	#boxY_long_plus_2

	0x20	0
	0x38	0
	0x50	0

	0x20	0x18
	#0x38	0x18 # unused
	0x50	0x18

	0x20	0x30
	0x38	0x30
	0x50	0x30

: fivewide # (152 bytes)
	0xF0 0x88 0x88 0x88 0xF0 0x88 0xF0 0x90
	0x88 0x90 0xE0 0x90 0x88 0xC8 0xA8 0x98
	0x88 0x88 0xF8 0x88 0x88 0x88 0x88 0x70
	0x88 0xD8 0xA8 0x88 0x88 0x50 0x50 0x20
	0x78 0x80 0x80 0x80 0x78 0x80 0x98 0x88
	0x70 0x88 0x88 0x98 0x78 0x80 0x70 0x08
	0xF0 0xF8 0x80 0xF0 0x80 0xF8 0x20 0x20
	0x20 0xF8 0x20 0x20 0x20 0x20 0x60 0x20
	0x20 0xF8 0x70 0x80 0xF0 0x88 0x70 0x88
	0x70 0x88 0x70 0x88 0x30 0x40 0xF8 0x20
	0x20 0x20 0xE0 0x88 0x88 0xA8 0xA8 0x50
	0x50 0x50 0x00 0x50 0xF8 0x80 0xF0 0x08
	0xF0 0x08 0x70 0x08 0xF0 0x88 0x50 0x20
	0x40 0x80 0x00 0x00 0x00 0x00 0x00 0x70
	0x88 0x88 0x88 0x70 0xF0 0x88 0xF0 0x88
	0xF0 0x80 0x80 0x88 0x50 0x20 0x50 0x88
	0xF8 0x88 0x78 0x88 0xF8 0x08 0x08 0x10
	0x10 0x30 0x50 0x90 0xF8 0x10 0x20 0x40
	0xF8 0x80 0xF0 
	: four80s
	0x80 0x80 0x80 0x80
	0xF8
